//
// Created by Lantz on 2024/3/1.
//
#include <stdio.h>
#include <stdlib.h>
// 王道书的链表
typedef int Elem;
typedef struct Node{
    Elem data;
    struct Node * next;

}LNode, *LinkList;

// 初始化长度
bool InitList(LinkList &L){
    L = (LNode *)malloc(sizeof(Node));
    L->next = NULL;
    return true;
}
bool InitList_NoneHead(LinkList &L){
    L = NULL;
    return true;
}

// 求表长
int length_list(LinkList L){
    int len = 0;
    LNode * p = L;
    while (p->next != NULL){
        p = p->next;
        len++;
    }
    return len;
}

// 插入操作
bool Insert_list(LinkList &L, int i, Elem e){
    LNode * p = L;
    int j = 0; // 记录当前位序
    while (p != NULL && j < i-1){
        p = p->next; // 往后找到第 i-1 个节点
        j++;
    }
    if (p == NULL){
        return false;
    }
    LNode * s = (LNode *) malloc(sizeof(Node)); // 新的节点
    s->data = e; // 赋值所插入的节点数据
    s->next = p->next; // s 的指针域指向 p 插入前所指向的区域
    p->next = s; // p 的指针域指向了新节点 s
    return true;
}

// 删除
bool delete_list(LinkList &L, int i, Elem &val){
    LNode * p = L;
    int j = 0;
    while(p != NULL && j < i-1){
        p = p->next;
        j++;
    }
    if(p == NULL || p->next || j > i-1){
        return false;
    }
    LNode * q = p->next;
    q->data = val; // 维护被删除值
    p->next = q->next; // 断链
    free(q); // 释放临时存放删除值结点的空间
    return true;
}

// 头插法
LinkList HeadInsert(LinkList &L){
    LNode * s;
    int x;
    L = (LNode *)malloc(sizeof(Node));
    L->next = NULL; // 初始化空链表
    scanf("%d", &x);
    while (x != 9999) { // 输入9999代表停止
        s = (LNode *) malloc(sizeof(Node));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d", &x);
    }
    return L;
}

// 尾插法
LinkList TailInsert(LinkList &L){
    int x;
    L = (LNode *) malloc(sizeof(Node));
    LNode * s, * r = L;
    scanf("%d", &x);
    while (x != 9999){
        s = (LNode *) malloc(sizeof(Node));
        s->data = x;
        r->next = s;
        r = s; // r 指向新的节点
        scanf("%d", &x);
    }
    r->next = NULL; // 尾指针置空
    return L;
}

// 打印链表
void PrintList(LinkList L){
    L = L->next;
    while (L != NULL){
        printf("%d", L->data);
        L = L->next;
        if(L != NULL){
            printf(" ");
        }
    }
    printf("\n");
}

// 判断是否中心对称, 3 4 5 5 4 3
int DC(LinkList L, int n){
    int i;
    LNode *p = L->next;
    int s[n / 2];
    for (i = 0; i < n / 2; i++){
        s[i] = p->data;
        printf("i = %d, s[i] = %d\n", i, s[i]);
        printf("p->data = %d\n", p->data);
        p = p->next;
    }
    printf("i = %d\n", i);
    i--; // 原因：循环终止条件是 i < n / 2，因此当 i 变成3时，循环结束
    printf("i = %d\n", i);
    if(n % 2 == 1) p = p->next; // 奇数情况
    while(p != NULL && s[i] == p->data){
        i--;
//        printf("i = %d\n", i);
        p = p->next;
    }
    if(i == -1) // 栈空
        return 1;
    else
        return 0;
}

int main(void){
    LinkList L;
    Elem val;
//    HeadInsert(L);
//    PrintList(L);
    TailInsert(L);
    PrintList(L);
    int ans;
    ans = DC(L, 6);
    printf("%d\n", ans);
    return 0;
}